﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistencia;
using GestorDeFlotasModelo.Entities;
using Persistencia.Interfaces;
using System.Data.SqlClient;

namespace GestorDeFlotasModelo.Factorias
{
    public class FactoriaReloj : Factoria, IIdentityFactory
    {
        private FactoriaReloj(TransaccionBase tran)
            : base(tran)
        {
        }
        
        public override string NombreTabla
        {
            get { return " NUESTRA_RUBIA_ES_MEJOR.Reloj "; }
        }

        protected override IPersistibleModelo NuevoPersistible(HashTableNCSensitive htsNc)
        {
            return new Reloj();
        }

        protected override string Id(HashTableNCSensitive hts)
        {
            return hts["Reloj_Id"].ToString();
        }

        protected override HashTableNCSensitive ParametrosClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Reloj_Id", null);
            return parameters;
        }

        protected override HashTableNCSensitive ParametrosNoClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Reloj_NroSerie", null);
            parameters.Add("Reloj_Marca",null);
            parameters.Add("Reloj_Modelo", null);
            parameters.Add("Reloj_Habilitado", null);
            parameters.Add("Reloj_Fecha_Ver", null);
            return parameters;
        }

        protected override Predicate<IPersistibleModelo> FiltroXId(string id)
        {
            return delegate(IPersistibleModelo iPer)
            {
                return ((Reloj)iPer).Id == long.Parse(id);
            };
        }

        public List<Reloj> SelectRelojesConFiltro(string marca, string modelo, string nroSerie)
        {
            string where = " WHERE ((@Marca IS NULL OR  LOWER(Reloj_Marca) = @Marca) AND "
                                 + "(@Modelo IS NULL OR LOWER(Reloj_Modelo) LIKE '%' + @Modelo + '%') AND "
                                 + "(@NroSerie IS NULL OR LOWER(Reloj_NroSerie) LIKE '%' + @NroSerie + '%')) ";
            List<SqlParameter> parametros = new List<SqlParameter>();

            if (string.IsNullOrEmpty(marca))
                parametros.Add(new SqlParameter("@Marca", DBNull.Value));
            else
                parametros.Add(new SqlParameter("@Marca", marca.ToLower()));

            if (string.IsNullOrEmpty(modelo))
                parametros.Add(new SqlParameter("@Modelo", DBNull.Value));
            else
                parametros.Add(new SqlParameter("@Modelo", modelo.ToLower()));

            if (string.IsNullOrEmpty(nroSerie))
                parametros.Add(new SqlParameter("@NroSerie", DBNull.Value));
            else
                parametros.Add(new SqlParameter("@NroSerie", nroSerie));

            List<Reloj> relojes = base.Select<Reloj>(where,
                delegate(IPersistibleModelo iPer)
                {
                    return (string.IsNullOrEmpty(modelo) || ((Reloj)iPer).Modelo.ToLower().Contains(modelo.ToLower())) &&
                          (string.IsNullOrEmpty(nroSerie) || ((Reloj)iPer).NumeroDeSerie.ToLower().Contains(nroSerie.ToLower())) &&
                          (string.IsNullOrEmpty(marca) || ((Reloj)iPer).Marca == marca);
                }
                , parametros);

            relojes.Sort(delegate(Reloj r1, Reloj r2)
            {
                return r1.Id.CompareTo(r2.Id);
            });
            return relojes;
        }

        public Reloj Nuevo(string marca, string modelo, string nroSerie, bool habilitado, DateTime fechaVerif)
        {
            Reloj r = new Reloj();
            r.NumeroDeSerie = nroSerie;
            r.Modelo = modelo;
            r.Marca = marca;
            r.Habilitado = habilitado;
            r.FechaVerificacion = fechaVerif;
            base.Agregar(r);
            return r;
        }
    }
}
